import zipfile
import xmltodict
import os, shutil, time
from tkinter import filedialog

class Mygetofd():
    # 定义主函数 mygetofd，包含两个嵌套函数。
    def unzip_file(self, zip_path, unzip_path=None):

        # 如果没有提供 unzip_path，则通过去除文件扩展名从 zip_path 中推导出 unzip_path。
        if not unzip_path:
            unzip_path = zip_path.split('.')[0]  # 从 zip_path 中获取不带扩展名的基本名称。

        # 以读取模式打开 zip 文件。
        with zipfile.ZipFile(zip_path, 'r') as f:
            # 将 zip 存档中的所有文件提取到指定目录。
            for file in f.namelist():
                f.extract(file, path=unzip_path)  # 将每个文件提取到 unzip_path。

        return unzip_path  # 返回解压后文件存放的路径。

    def parse_ofd(self, path):
        file_path = self.unzip_file(path)  # 调用 unzip_file 函数提取 OFD 文件并获取路径。           

        # 以 UTF-8 编码打开 XML 内容文件进行读取。
        pages_directory = os.path.join(file_path, "Doc_0", "Attachs")
        for root, dirs, files in os.walk(pages_directory):   #目录的路径，目录列表，文件列表
            for file in files:
                if "rai_issuer" in file:
                    xml_path = os.path.join(root, file)
                    with open(xml_path, "r", encoding="utf-8") as f:
                        _text = f.read()  # 读取 XML 文件的全部内容
                        tree = xmltodict.parse(_text)  # 将 XML 内容解析为 Python 字典
                        tree_data = tree['xbrl']
        print(tree_data)                 
        dic_data = self.result_data(tree_data, path)    
        print(dic_data)            
        #删除解压文件
        # self.delete_file(file_path)

    def delete_file(self, folder_path):
        shutil.rmtree(folder_path.replace('/', '\\'))

    def result_data(self, data, path):
        result_dic = {}
        result_dic["电子发票文件名"] = path
        result_dic["发票号码"] = data.get("rai:ElectronicInvoiceRailwayETicketNumber", "").get("#text", "")
        result_dic["发票类型"] = data.get("rai:TypeOfVoucher", "").get("#text", "")
        result_dic["开票日期"] = data.get("rai:DateOfIssue", "").get("#text", "")
        result_dic["购买方名称"] = data.get("rai:NameOfPurchaser", "").get("#text", "")
        result_dic["购买方统一社会信用代码"] = data.get("rai:UnifiedSocialCreditCodeOfPurchaser", "").get("#text", "")
        result_dic["不含税金额"] = data.get("rai:TotalAmountExcludingTax", "").get("#text", "")
        result_dic["总税额"] = data.get("rai:TaxAmount", "").get("#text", "")
        result_dic["含税金额"] = data.get("rai:Fare", "").get("#text", "")
        result_dic["电子客票号"] = data.get("rai:ETicketNumber", "").get("#text", "")
        result_dic["出发站"] = data.get("rai:DepartureStation", "").get("#text", "")
        result_dic["目的站"] = data.get("rai:DestinationStation", "").get("#text", "")
        result_dic["车次号"] = data.get("rai:TrainNumber", "").get("#text", "")
        result_dic["出发日期"] = data.get("rai:TravelDate", "").get("#text", "")
        result_dic["发车时间"] = data.get("rai:DepartureTime", "").get("#text", "")
        result_dic["座次"] = data.get("rai:SeatLevel", "").get("#text", "")
        result_dic["座位号"] = data.get("rai:Seat", "").get("#text", "")
        result_dic["乘车人"] = data.get("rai:Name", "").get("#text", "")
        result_dic["证件号"] = data.get("rai:IdNumber", "").get("#text", "")
        
        return result_dic

if __name__ == '__main__':
    myofdfile = filedialog.askopenfilename(defaultextension='.ofd')
    my_getter = Mygetofd()
    _data_dict = my_getter.parse_ofd(myofdfile)